package monitoreo;

/**
 * Control de valores estadisticos de una secuencia de valores enteros.
 *
 * @author Esteban Alejandro Czelada
 */
public class Resumen {

    private long minimo = 0;
    private long maximo = 0;
    private double media = 0;
    private double varianza = 0;
    private double s = 0;
    private long cantidad = 0;

    public void limpiar () {
        minimo = 0;
        maximo = 0;
        media = 0;
        varianza = 0;
        s = 0;
        cantidad = 0;
    }

    public synchronized void actualizar(long valor) {
        if (cantidad == 0) {
            minimo = valor;
            maximo = valor;
            media = valor;
            varianza = 0;
        } else {
            minimo = Math.min(minimo, valor);
            maximo = Math.max(maximo, valor);
            double nuevaMedia = media*(cantidad)/(cantidad+1.0) + valor/(cantidad+1.0);
            s = s + (valor-media)*(valor-nuevaMedia);
            media = nuevaMedia;
            varianza = Math.sqrt(this.s/ (cantidad+1.0) );
        };
        cantidad += 1;
    }   
    
    public String toString() {
        return (minimo + "," + maximo + "," + media + "," + varianza + "," + cantidad);
    }
}
